home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / video / fly8111-.000 / fly8111- / fly8 / MSDOS / pcdos.c < prev    next >
C/C++ Source or Header  |  1979-12-31  |  4KB  |  236 lines

  1. /* --------------------------------- Pcdos.c -------------------------------- */
  2.  
  3. /* This is part of the flight simulator 'fly8'.
  4.  * Author: Eyal Lebedinsky (eyal@ise.canberra.edu.au).
  5. */
  6.  
  7. /* general system-specific stuff for PcDOS.
  8. */
  9.  
  10. #include "fly.h"
  11.  
  12. #include <signal.h>
  13. #include <dos.h>
  14. #include <conio.h>
  15.  
  16. /* Pcdos/console.c */
  17. extern int    FAR PcPush (int c);
  18.  
  19. #ifdef FLY8_BC2
  20. #define _dos_getvect    getvect
  21. #define _dos_setvect    setvect
  22. #endif
  23.  
  24. #define INT_DIV0    0x0000
  25.  
  26. #ifdef FLY8_MSC
  27. static void (CDECL INTERRUPT FAR *old_div0)() = 0;
  28. #else
  29. static void INTERRUPT (FAR * old_div0)() = 0;
  30. #endif
  31.  
  32. LOCAL_FUNC void FAR CDECL LOADDS
  33. PcSigInt (int sig)
  34. {
  35.     signal (SIGINT, PcSigInt);
  36.  
  37.     PcPush (K_CTRL | 'c');
  38. }
  39.  
  40. LOCAL_FUNC void FAR CDECL LOADDS
  41. PcSigShutdown (int sig)
  42. {
  43. #ifdef SIGBREAK
  44.     signal (SIGBREAK, SIG_IGN);
  45. #endif
  46. #ifdef SIGTERM
  47.     signal (SIGTERM,  SIG_IGN);
  48. #endif
  49.  
  50.     MsgEPrintf (-10, "Shutdown requested");
  51.  
  52.     st.flags1 |= SF_TERM;
  53. }
  54.  
  55. #ifdef SIGABRT
  56. LOCAL_FUNC void FAR CDECL LOADDS
  57. PcSigAbort (int sig)
  58. {
  59.     MsgEPrintf (-10, "Abort requested");
  60.     die ();
  61. }
  62. #endif
  63.  
  64. #ifdef FLY8_MSC
  65. LOCAL_FUNC void FAR CDECL INTERRUPT
  66. #else
  67. LOCAL_FUNC void FAR INTERRUPT
  68. #endif
  69. PcDiv0 (int dummy)
  70. {
  71.     Uint        *p;
  72.     int        i, j;
  73.     Uchar        FAR * FAR *q, FAR *qq;
  74.     extern        FAR C_MAIN ();
  75.     Uchar        FAR *m = (Uchar *)C_MAIN;
  76. #if defined(USE_ASM) && defined(MSDOS)
  77.     Uchar        FAR *md = (Uchar *)muldiv;
  78.     Uchar        FAR *fd = (Uchar *)fdiv;
  79.     Uchar        FAR *ad = (Uchar *)dithadj;
  80. #endif
  81.  
  82.     LogPrintf ("divide overflow\n");
  83.  
  84.     p = (Uint *)&dummy;
  85.     LogPrintf ("\n");
  86.     LogPrintf ("stack at  %p:", p);
  87.     for (j = 0, i = -16; i < 128; ++i, ++j) {
  88.         if (!(j%8))
  89.             LogPrintf ("\n%04x ", 2*i);
  90.         else if (!(j%4))
  91.             LogPrintf (" ");
  92.         LogPrintf (" %04x", p[i]);
  93.     }
  94.     LogPrintf ("\n");
  95.  
  96.     q = (Uchar FAR * FAR *)(p + FAULT_OFFSET);
  97.     qq = *q;
  98.  
  99.     LogPrintf ("\n");
  100.     LogPrintf ("main   at %p\n", m);
  101. #if defined(USE_ASM) && defined(MSDOS)
  102.     if (qq > md && qq <= md+16) {
  103.         LogPrintf ("fault in muldiv(), tracing back\n");
  104.         q = (Uchar FAR * FAR *)(p + MULDIV_OFFSET);
  105.         qq = *q;
  106.     } else
  107.     if (qq > fd && qq <= fd+16) {
  108.         LogPrintf ("fault in fdiv(), tracing back\n");
  109.         q = (Uchar FAR * FAR *)(p + MULDIV_OFFSET);
  110.         qq = *q;
  111.     } else
  112.     if (qq > ad && qq <= ad+30) {
  113.         LogPrintf ("fault in dithadj(), tracing back\n");
  114.         q = (Uchar FAR * FAR *)(p + MULDIV_OFFSET);
  115.         qq = *q;
  116.     }
  117. #endif
  118.     LogPrintf ("fault at  %p", qq);
  119.     for (j = 0, i = -64; i < 64; ++i, ++j) {
  120.         if (!(j%16))
  121.             LogPrintf ("\n%p ", qq+i);
  122.         else if (!(j%4))
  123.             LogPrintf (" ");
  124.         LogPrintf ("%02x", qq[i]);
  125.     }
  126.     LogPrintf ("\n");
  127.     LogPrintf ("+++1 %p %p\n", qq, m);
  128.     LogPrintf ("Please run the 'find' batch file\n");
  129.  
  130.     die ();
  131. }
  132.  
  133. LOCAL_FUNC int FAR
  134. PcInit (void)
  135. {
  136.     old_div0 = _dos_getvect (INT_DIV0);
  137.     _dos_setvect (INT_DIV0, PcDiv0);
  138.  
  139.     signal (SIGINT,   PcSigInt);
  140.  
  141. #ifdef SIGBREAK
  142.     signal (SIGBREAK, PcSigShutdown);
  143. #endif
  144. #ifdef SIGTERM
  145.     signal (SIGTERM,  PcSigShutdown);
  146. #endif
  147.  
  148. #ifdef SIGABRT
  149.     signal (SIGABRT,  PcSigAbort);
  150. #endif
  151.  
  152.     return (0);
  153. }
  154.  
  155. LOCAL_FUNC void FAR
  156. PcTerm (void)
  157. {
  158.     signal (SIGINT,   SIG_DFL);
  159.  
  160. #ifdef SIGBREAK
  161.     signal (SIGBREAK, SIG_DFL);
  162. #endif
  163. #ifdef SIGTERM
  164.     signal (SIGTERM,  SIG_DFL);
  165. #endif
  166.  
  167. #ifdef SIGABRT
  168.     signal (SIGABRT,  SIG_DFL);
  169. #endif
  170.     _dos_setvect (INT_DIV0, old_div0);
  171. }
  172.  
  173. LOCAL_FUNC Ulong FAR
  174. PcDisable (void)
  175. {
  176.     short    flags;
  177.  
  178.     _asm {
  179.         pushf
  180.         pop    flags
  181.         cli
  182.     }
  183.     return ((Ulong)flags);
  184. }
  185.  
  186. LOCAL_FUNC void FAR
  187. PcEnable (Ulong flags)
  188. {
  189.     short    t;
  190.  
  191.     t = (short)flags;
  192.     _asm {
  193.         push    t
  194.         popf
  195.     }
  196. }
  197.  
  198. LOCAL_FUNC void FAR
  199. PcShell (void)
  200. {
  201.     system ("command");
  202. }
  203.  
  204. /* Build file name from parts.
  205.  * path is NULL for "current directory".
  206.  * path is ""   for "root directory".
  207. */
  208. LOCAL_FUNC void FAR
  209. PcBuildFileName (char *FullName, char *path, char *name, char *ext)
  210. {
  211.     FullName[0] = '\0';
  212.  
  213.     if (path) {
  214.         strcat (FullName, path);
  215.         strcat (FullName, "\\");
  216.     }
  217.     strcat (FullName, name);
  218.     if (ext && ext[0]) {
  219.         strcat (FullName, ".");
  220.         strcat (FullName, ext);
  221.     }
  222. }
  223.  
  224. struct SysDriver NEAR SysDriver = {
  225.     "PCDOS",
  226.     0,
  227.     NULL,    /* extra */
  228.     PcInit,
  229.     PcTerm,
  230.     0,    /* poll */
  231.     PcDisable,
  232.     PcEnable,
  233.     PcShell,
  234.     PcBuildFileName
  235. };
  236.